Explicación de los componentes e implementación del entorno CFR (Cloud Fleet Routing) de Google
Primero tenemos que activar estas dos APIs:
Para hacer una consulta a la API podemos hacerlo mediante curl con el siguiente comando:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: $(ID-PROYECTO)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://cloudoptimization.googleapis.com/v1/projects/$(ID-PROYECTO):optimizeTours"
Necesitamos tener un archivo request.json en la ruta desde donde ejecutemos el comando, el archivo tendrá un contenido como el siguiente:
{
"parent": "projects/${YOUR_GCP_PROJECT_ID}",
"model": {
"shipments": [
{
"deliveries": [
{
"arrivalLocation": {
"latitude": 48.880942,
"longitude": 2.323866
},
"duration": "250s",
"timeWindows": [
{
"endTime": "1970-01-01T01:06:40Z",
"startTime": "1970-01-01T00:50:00Z"
}
]
}
],
"loadDemands": {
"weight": {
"amount": "10"
}
},
"pickups": [
{
"arrivalLocation": {
"latitude": 48.874507,
"longitude": 2.30361
},
"duration": "150s",
"timeWindows": [
{
"endTime": "1970-01-01T00:33:20Z",
"startTime": "1970-01-01T00:16:40Z"
}
]
}
]
},
{
"deliveries": [
{
"arrivalLocation": {
"latitude": 48.88094,
"longitude": 2.323844
},
"duration": "251s",
"timeWindows": [
{
"endTime": "1970-01-01T01:06:41Z",
"startTime": "1970-01-01T00:50:01Z"
}
]
}
],
"loadDemands": {
"weight": {
"amount": "20"
}
},
"pickups": [
{
"arrivalLocation": {
"latitude": 48.880943,
"longitude": 2.323867
},
"duration": "151s",
"timeWindows": [
{
"endTime": "1970-01-01T00:33:21Z",
"startTime": "1970-01-01T00:16:41Z"
}
]
}
]
}
],
"vehicles": [
{
"loadLimits": {
"weight": {
"maxLoad": 50
}
},
"endLocation": {
"latitude": 48.86311,
"longitude": 2.341205
},
"startLocation": {
"latitude": 48.863102,
"longitude": 2.341204
}
},
{
"loadLimits": {
"weight": {
"maxLoad": 60
}
},
"endLocation": {
"latitude": 48.86312,
"longitude": 2.341215
},
"startLocation": {
"latitude": 48.863112,
"longitude": 2.341214
}
}
]
}
}
Al recibir la respuesta de la solicitud al final del todo se indica cuantos vehiculos se han utilizado para realizar los repartos:
En este caso se ha utilizado un solo vehiculo para realizar los repartos a pesar de que hemos indicado dos vehiculos para hacer los repartos, esta situación se da porque la API determina que un solo vehiculo es suficiente para realizar todos los repartos.
En esta otra consulta al poner uno de los pedidos en una dirección más separada se utilizan dos vehiculos:
En esta otra consulta se ha utilizado un vehiculo y se ha descartado otro porque no se puede cumplir con la ventana de tiempo especificada:
Podemos indicar una restricción de tiempo global en la que todas las tareas tienen que ser realizadas en ese rango de tiempo, si alguna tarea no puede ser realizada es descartada.
Para usar la restriccion de tiempo global usamos el siguiente json dentro de model:
Example Request 1 "globalStartTime": {
"seconds": "1650412800"
},
"globalEndTime": {
"seconds": "1650535200"
}
Si queremos indicar una ventana de tiempo para cada tarea lo hacemos de la siguiente manera:
Example Request 2 "timeWindows": [
{
"startTime": {
"seconds": "1650412800"
},
"endTime": {
"seconds": "1650416400"
}
}
],
Las vetanas de tiempo pueden ser hard o soft, la vetana tipo hard es la que creamos en el paso anterior, para crear una tipo soft se hace asi:
Example Request 3 "softStartTime": {
"seconds": "1650413700"
},
"softEndTime": {
"seconds": "1650415500"
},
Para indicar restricciones de carga tenemos que indicar el limite de cada vehiculo y la carga de cada tarea, lo hacemos así:
Example Request 4En la tarea:
"loadDemands": {
"books": {
"amount": "1"
}
}
En el vehiculo:
"loadLimits": {
"books": {
"maxLoad": "2",
"startLoadInterval": {},
"endLoadInterval": {}
}
}
Costes de vehiculo:
"costPerHour": 2,
"costPerKilometer": 2,
"fixedCost": 50,
Configurar si tener en cuenta el tráfico:
"considerRoadTraffic": false,
Configurar modo de busqueda:
"searchMode": 1,
Si no tenemos activada la API Cloud Optimization API obtendremos el siguiente error:
"code": 403,
"message": "Cloud Optimization API has not been used in project 160010338462 before or it is disabled. Enable it
by visiting https://console.developers.google.com/apis/api/cloudoptimization.googleapis.com/overview?project=160010338462
then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
"status": "PERMISSION_DENIED"
Si no tenemos activada la API Google Maps for Fleet Routing obtendremos el siguiente error:
"error": {
"code": 403,
"message": "mapsfleetrouting.googleapis.com is not enabled.",
"status": "PERMISSION_DENIED"
Si el token que estamos utilizando está caducado, obtendremos el siguiente error:
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token,
login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED"
java | CFR